package com.munhrasoft.dinamica.managedbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.Corretor;
import com.munhrasoft.dinamica.business.logic.CorretorEJB;

@ManagedBean
@ViewScoped
public class CorretorController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger  logger       = Logger.getLogger(CorretorController.class.getName());

    @EJB
    private CorretorEJB    corretorEJB;

    private Corretor       corretor     = new Corretor();
    private Corretor       pesqcorretor = new Corretor();
    private Corretor       rescorretor  = new Corretor();
    private List<Corretor> corretorList = new ArrayList<Corretor>();

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        corretorList = corretorEJB.fetchAllCorretores();
        pesqcorretor = new Corretor();
        corretor = new Corretor();
        rescorretor = new Corretor();
    }

    public void createCorretor(ActionEvent actionEvent) {
        corretor = corretorEJB.createCorretor(corretor);
        corretor = new Corretor();
        pesqcorretor = new Corretor();
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída", "Corretor criado com sucesso");
    }

    public void pegarTodosCorretores(ActionEvent actionEvent) {
        corretorList = corretorEJB.fetchAllCorretores();

        if (!corretorList.isEmpty()) {
            pesqcorretor = corretorList.get(0);
        } else {
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Nenhum corretor encontrado");
        }

    }

    public void saveCorretor(ActionEvent actionEvent) {
        pesqcorretor = corretorEJB.updateCorretor(pesqcorretor);
        if (pesqcorretor != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Corretor atualizado com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "O Corretor não foi atualizado");
        }
    }

    public void removeCorretor(ActionEvent actionEvent) {
        // TODO acho que nao vai dar para apenas remover o corretor, se ele estiver amarrado
        // a algum processo.

        if (pesqcorretor != null) {
            corretorEJB.removeCorretor(pesqcorretor);
            corretorList = corretorEJB.fetchAllCorretores();
            pesqcorretor = new Corretor();
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Corretor removido com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou", "Corretor não selecionado");
        }

    }

    public void rowSelect(SelectEvent event) {
        logger.info("Row select");
        pesqcorretor = rescorretor;

    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed " + event.getTab().getId());
        corretorList = corretorEJB.fetchAllCorretores();
        pesqcorretor = new Corretor();
        corretor = new Corretor();
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public Corretor getCorretor() {
        return corretor;
    }

    public void setCorretor(Corretor corretor) {
        this.corretor = corretor;
    }

    public Corretor getPesqcorretor() {
        return pesqcorretor;
    }

    public void setPesqcorretor(Corretor pesqcorretor) {
        this.pesqcorretor = pesqcorretor;
    }

    public Corretor getRescorretor() {
        return rescorretor;
    }

    public void setRescorretor(Corretor rescorretor) {
        this.rescorretor = rescorretor;
    }

    public List<Corretor> getCorretorList() {
        return corretorList;
    }

    public void setCorretorList(List<Corretor> corretorList) {
        this.corretorList = corretorList;
    }

}
